package cn.liufuwen.websocket.netty;


import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class WebSocketServer {
    /**
     * 启动WebSocket服务器。
     * 此方法配置并启动一个服务器，该服务器使用NIO（非阻塞I/O）来处理客户端连接。
     * 它绑定了一个端口，并等待客户端连接，以便进行WebSocket通信。
     *
     * @throws Exception 如果服务器启动过程中遇到任何错误，则抛出异常。
     */
    public void start() throws Exception {
        // 创建主事件循环组和子事件循环组。它们分别处理服务器和客户端的I/O事件。
        EventLoopGroup mainGroup = new NioEventLoopGroup();
        EventLoopGroup subGroup = new NioEventLoopGroup();
        try {
            // 配置服务器启动器，设置各种选项并指定处理程序。
            ServerBootstrap serverBootstrap = new ServerBootstrap();
            // 设置服务器的backlog大小，即同时等待连接的数量。
            serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024);
            // 使用主事件循环组和子事件循环组，并指定使用NioServerSocketChannel作为服务器通道类型。
            serverBootstrap.group(mainGroup, subGroup)
                    .channel(NioServerSocketChannel.class)
                    // 为新建立的客户端连接指定处理器。
                    .childHandler(new WebSocketServerInitialzer());
            // 绑定服务器到指定端口并同步等待操作完成。
            ChannelFuture future = serverBootstrap.bind(6012).sync();
            // 输出服务器绑定的地址，表示服务器已启动并监听客户端连接。
            log.info("WebSocketServer启动成功，正在监听： " + future.channel().localAddress());
            // 等待服务器通道关闭。这确保了服务器在终止时正确清理资源。
            future.channel().closeFuture().sync();
        } finally {
            // 关闭主事件循环组和子事件循环组，释放它们所占用的资源。
            mainGroup.shutdownGracefully().sync();
            subGroup.shutdownGracefully().sync();
        }
    }

}
